package juego;

import java.util.ArrayList;
import vista.VistaCaza;

import ar.uba.fi.algo3.titiritero.Dibujable;



public class Caza extends Armado {

	//Atributos de clase
	private static int miImpacto = 10;
	private static int miPuntajePorDestruccion = 30;
	private static int miResistenciaMaxima = 6;
	private static int miTamanio = 4;
	private static int miVelocidad = 3;
	private static int miTiempoEspera = 4;
	
	
	//metodos
	
	//Constructor recibe coordenada
	public Caza(Coordenada ubicacion){
		super(ubicacion, miResistenciaMaxima, miTiempoEspera);
		ArmaTorpedoSimple unArmaTorpedoSimple = new ArmaTorpedoSimple();
		this.armamento.add(unArmaTorpedoSimple);
		
	};
	
	//Constructor recibe 2 enteros
	public Caza(int x, int y){
		super(new Coordenada(x,y), miResistenciaMaxima, miTiempoEspera);
		ArmaTorpedoSimple unArmaTorpedoSimple = new ArmaTorpedoSimple();
		this.armamento.add(unArmaTorpedoSimple);
		
	};

	
	//Constructor recibe 2 enteros y un arma que es la que tendra
	public Caza(int x, int y, Disparable arma){
		super(new Coordenada(x,y), miResistenciaMaxima, miTiempoEspera);
		this.armamento.add(arma);
		
	};

	
	@Override
	protected int velocidad() {
		return miVelocidad;
	}

	@Override
	public int verTamanio() {
		return miTamanio;
	};
	
	//Devuelve el impacto provocado
    @Override
	public Impacto impactoProvocado(){
		return new ImpactoLineal(miImpacto);
	};  
    
    //Devuelve el puntaje por haber sido destruido
    public int puntajePorDestruccion(){
    	return miPuntajePorDestruccion;
    };

    //Devuelve el tamanio de el caza
    public int tamanio(){
	    return miTamanio;
    };

    
    /*
     * ver esto, mepa q se tendrian q mover al reves
     */
    protected void movimientoPropio(){
    	this.ubicacion.moverEnXY(0,this.velocidad());
    };

    
  
//    //Retorna el puntaje. Este metodo se encarga de la destruccion y liberacion
//    //de las armas.
//    @Override
//    protected int impactar(ArrayList<Movil> listaDeMoviles, ArrayList<Botin> listaDeBotines){
//		
//		int puntaje = 0;
//		Iterator<Movil> iterador = listaDeMoviles.iterator();
//		boolean contacto;
//				
//		while (iterador.hasNext()){
//			
//			Movil movil = iterador.next();
//			try {
//				contacto = movil.huboContacto(this);
//				
//				//solo puede ser impactado por el algo42 o proyectiles de este
//				if (contacto & movil.verLealtad()){
//					
//					//recibe el impacto
//					movil.impactoProvocado().herir(this.resistencia);
//										
//					//provoca el impacto
//					movil.recibirImpacto(this.impactoProvocado(), listaDeMoviles, listaDeBotines);
//					
//					//si no esta vivo lo elimina de la lista
//					if (!movil.estaVivo()){
//						iterador.remove();
//					};
//				}
//			}
//			catch (ExcepcionMismoElemento e){}
//		}
//		
//		if (!this.resistencia.quedaEnergia()){
//			
//			//deja el botin
//			this.dejarBotin(listaDeBotines);
//			
//			this.destruirse(listaDeMoviles);
//			puntaje = this.puntajePorDestruccion();
//			if (this.esGuia){
//				this.provocarHuida(listaDeMoviles);
//			}
//		}
//		
//		return puntaje;
//	};
//	
	
//	//Retorna el puntaje. Este metodo se encarga de la destruccion y liberacion
//    //de las armas.
//	@Override
//	public int recibirImpacto(Impacto danio, ArrayList<Movil> listaDeMoviles, ArrayList<Botin> listaDeBotines){
//		
//		danio.herir(this.resistencia);
//		
//		if (resistencia.quedaEnergia()){
//			return 0;
//		}
//		else {
//			//deja el botin
//			this.dejarBotin(listaDeBotines);
//			
//			this.vivo = false;
//			if (this.esGuia){
//				this.provocarHuida(listaDeMoviles);
//			}
//			return this.puntajePorDestruccion();}
//	};
	
	
	private void dejarBotin(ArrayList<Botin> listaDeBotines) {
		Botin tanque = new TanqueEnergia(this.ubicacion);
		listaDeBotines.add(tanque);
	}
	
	
	@Override
	public Dibujable getDibujable() {
		Dibujable dibujable = new VistaCaza();
		dibujable.setPosicionable(this);
		return dibujable;
	}
	
	//se encarga de destruirse si corresponde. deja el botin. devuelve el puntaje
	@Override
    protected int verificarDestruccion(ArrayList<Movil> listaDeMoviles, ArrayList<Botin> listaDeBotines){
		//si queda energia no se destruye
		if(this.resistencia.quedaEnergia()){
			return 0;
		}
		
		this.dejarBotin(listaDeBotines);
		this.destruirse(listaDeMoviles);
		if (this.esGuia){
			this.provocarHuida(listaDeMoviles);
		}
		return this.puntajePorDestruccion();
	}


	
		
	

}
